package ee.ttu.serge.container.dynamicarray;

public class DynamicArray {

   private int[] array;
   private int pos;
   
   /**
    * Loob dünaamilise massiivi algse suurusega n O(1)
    */
   public void create(int n) {
      array = new int[n];
      pos = 0;
   }
   /**
    * Lisab arvu x massiivi lõppu O(1)*
    */
   public void add(int x) {
      if (pos >= array.length) {
         int[] newArray = new int[array.length * 2];
         for (int i = 0; i < array.length; i++) {
            newArray[i] = array[i];
         }
         array = newArray;
      }
      array[pos] = x;
      pos++;
   }
   /**
    * Väljastab ja eemaldab viimase elemendi O(1)*
    */
   public int rem() {
      if (pos <= array.length / 4) {
         int[] newArray = new int[array.length / 2];
         for (int i = 0; i < pos; i++) {
            newArray[i] = array[i];
         }
         array = newArray;
      }
      if (pos == 0) return 0;
      return array[--pos];
   }
   /**
    * Väljastab väärtuse kohal i O(1)
    */
   public int get(int i) {
      if (i < 0 || pos <= i) return 0;
      return array[i];
   }
   /**
    * Muudab väärtuse kohal i O(1)
    * @param value - väärtus
    * @param pos - positsioon
    */
   public void put(int value, int pos) {
      if (pos >= 0 || pos > pos) {         
         array[pos] = value;
      }
   }
   /**
    * Väljastab massiivis olevate elementide arvu O(1)
    */
   public int len() {
      return pos;
   }
   
   // ABISTAVAD MEETODID //
   
   public void print() {
      System.out.println("Array size: " + array.length);
      for (int i = 0; i < pos; i++) {
         System.out.println(array[i]);
      }
   }
   
   public int size() {
      return array.length;
   }
   
   public int pos() {
      return pos;
   }
   
}
